package ui.swing.concurrency;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JPanel;

import ui.swing.Console;

public class ColorBoxes extends JApplet {
	private boolean isApplet = true;
	private int grid = 12;
	private int pause = 50;

	public void init() {
		// Get parameters from Web page:
		if (isApplet) {
			String gsize = getParameter("grid");
			if (gsize != null)
				grid = Integer.parseInt(gsize);
			String pse = getParameter("pause");
			if (pse != null)
				pause = Integer.parseInt(pse);
		}
		Container cp = getContentPane();
		cp.setLayout(new GridLayout(grid, grid));
		for (int i = 0; i < grid * grid; i++)
			cp.add(new CBox(pause));
	}

	public static void main(String[] args) {
		ColorBoxes applet = new ColorBoxes();
		applet.isApplet = false;
		if (args.length > 0) {
			applet.grid = Integer.parseInt(args[0]);
		}
		if (args.length > 1) {
			applet.pause = Integer.parseInt(args[1]);
		}
		Console.run(applet, 500, 400);
	}
}

class CBox extends JPanel implements Runnable {

	private static final Color[] colors = { Color.BLACK, Color.BLUE,
			Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN,
			Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK,
			Color.RED, Color.WHITE, Color.YELLOW };

	private static Random rand = new Random();

	private static final Color newColor() {
		return colors[rand.nextInt(colors.length)];
	}

	private Thread t;
	private int pause;

	private Color cColor = newColor();

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(cColor);
		Dimension s = getSize();
		g.fillRect(0, 0, s.width, s.height);
	}

	public CBox(int pause) {
		this.pause = pause;
		t = new Thread(this);
		t.start();
	}

	public void run() {
		while (true) {
			cColor = newColor();
			repaint();
			try {
				Thread.sleep(pause);
			} catch (InterruptedException e) {
				throw new RuntimeException(e);
			}
		}
	}
}